/**
 * thinknode 项目
 * 
 * 如果按传统模式开发很容易，职责混淆，为了兼容node单线程，还要大量使用异步.
 * 
 * 
 * thinknde用到的技术栈：thinknode采用mvc设计模式，具有高并发低延时的优点，易扩展,自建session机制常州内存,高效读取....
 * 
 * 
 * mvc 对这种传统开发模式一个总结，是一种设计模式,其实是对传统开发的职责的一种抽离，mvc 就类似 电脑运行的流程
 * 
 *     c controller 就是指挥者， m modle 就相当于电脑的组件，像磁盘，内存，做具体的工作， v view 视图，就是给前端的html
 * 
 * 
 * 网站项目目录：
 * 
 *             网站项目包含：js 脚本，css html imgs，我们要有规律的去规划这些目录，当然这种目录规划，不是唯一的，可自行觉得
 * 
 *             thinknode:大致目录
 * 
 * 
 *              config 配置目录
 *   
 *              home   前台目录
 *                 controller 前台的控制器
 *                 views      前台的页面
 *                 css        前台的css
 *                 imgs       前台图片
 *                 js         前台的js目录
 * 
 *              admin   后端目录 已 home  类似
 * 
 *              model   模型目录，model 简单的可以为就是数据库相关逻辑
 * 
 *              app.js  入口文件
 * 
 * 
 * 如何去优化，传统的开发模式：
 * 
 *             因为传统开发，很容易职责混淆 (mvc 模式已解决),大概的闭包(promise 优化)
 * 
 *             闭包的优化方案：promise  await  async (重点)
 * 
 * 
 */

/**
 * promise 讲解：promise 翻译过来就是 承诺 誓言, 承认是针对将来的，而且就两种结果：一是 做不到，二是 很乖 做到了
 * 
 *         promise 有各状态：pending,其实就是初始化,就是在发誓,resolve( 也叫fulfilled) 就是遵守了诺言，reject 就是没遵守
 *    
 *         pending---》结果，就是誓言的状态，是不是只能是 成功或者失败
 *           
 * 
 * 我们的闭包，简单就是说异步，需要耗时，也是将来的，而且，也有失败的可能
 * 
 * 使用promise 就比较像 同步函数了，但是还不够完善，然后衍生了 await  async
 * 
 * await : async wait 异步等待
 * 
 * async ： 一般加在函数名前，标明是个异步函数
 * 
 * 小结 ：：：：：：：：await/async 是基于 promise 实现，他们能让代码看起来像同步的，其实它还是非阻塞的
 * 
 *                    没有 await 与 async promise 是不是使用then catch 去处理结果，加上 await/asycn 代码就跟同步的类似了
 * 
 *                    await 只能出现在 async 函数内部
 * 
 *                    
 * 
 * 
 * 
 * 
 * 
 *  
 * 
 */

function demoPromise(){

    let promise= new Promise(function(resolve,reject){

        setTimeout(function(){
            resolve('我不遵守了诺言,工资都不给你了');
            console.log(promise);

        },2000)


    })
    return promise;

}
//then 然后
// demoPromise().then(function(x){
//     console.log('遵守');
//     console.log(x)
// },function(y){
//     console.log('不遵守');
//     console.log(y)
// });

/**
 * promise 加上 await 于 async 就是能实现 异步等待
 * 
 * 
 * 
 */

async function demoAwaitAndPromiseAndAsync(){

  let result =await demoPromise();//promise 前加上 await，就异步阻塞了,其实就这么理解，告诉cpu，我这边要阻塞了哦，
                                  //你先去忙别的事情，我这边一定要等这个结果出来，才能完成操作
                                  // await只能出现在 async 函数内部，你不信，你把这个函数的 async 干掉试试......
                                  //demoPromise 返回值 resolve 或是 reject 的值
  console.log('我在函数的最上面');
  console.log(result);
  console.log('我在函数的最下面1');
  console.log('我在函数的最下面2');
  console.log('我在函数的最下面3');
  console.log('我在函数的最下面4');
}

// demoAwaitAndPromiseAndAsync();

// console.log('我是函数demoAwaitAndPromiseAndAsync 下面的输出代码哦，你猜猜我怎么执行');
// console.log('我是函数demoAwaitAndPromiseAndAsync 下面的输出代码哦，你猜猜我怎么执行');

/**
 * 用promise 与 await 去
 * 实操一个，mysql 的封装
 * 在项目中，数据库查询是必不可少的，数据库的优化是后端人员提升的一个标致
 *
 * 
 */

 let mysql = require("mysql");

 function query(sql,values){

    return new Promise(function(resolve,reject){

        let connection = mysql.createConnection({host:'localhost',user:'root',password:'root',port:'3306',database:'situation'})
        connection.connect();
        //占位符的预编译sql，能大大减少sql的注入，百分之60,70的网站被黑，基本都是 sql注入造成的
        connection.query(sql,values,function(err,result){
             if(err){
                 reject(err);
             }else{
                 resolve(result);
             }
             connection.end();

        });
    });

}

let sql='select * from china where id=?'


async function select(sql,values){
    let result = await query(sql,values)
    console.log(result);

}

select(sql,2);

/**
 * 作业：把课程代码都敲一敲，比较难理解，自己搭建一个web服务器，使用 mysql 的promise 封装，去实现一个动态页面，可以参看，课堂的代码，
 * 
 * 可根据url 参数去动态的查询数据库，然后渲染到静态页面中,可参考 动态网站demo.js
 * 
 */



